Ruby 日記 5日目: includeの引数に複数のモジュールを指定した場合、 最後の引数から順にincludeする
次のコードを実行するとどうなりますか
code:gold/ex05/main.rb
module M1
end
module M2
end
class C
include M1, M2
end
p C.ancestors
選択肢:
[C, M1, M2, Object, Kernel, BasicObject]が表示される
[C, M2, M1, Object, Kernel, BasicObject]が表示される
[M1, M2, C, Object, Kernel, BasicObject]が表示される
[M2, M1, C, Object, Kernel, BasicObject]が表示される
解説:
モジュールの機能追加は、クラスの継承関係の間にそのモジュールが挿入 されることで実現されています。従って、メソッドの探索などは スーパークラスよりもインクルードされたモジュールのほうが 先に行われます
CクラスはObjectクラスを継承しているので、M1やM2はCクラスとObjectクラスの間に入るってことになる
引数に複数のモジュールを指定した場合、 最後の引数から順にインクルードします。
つまり
code:c.rb
class C
include M1, M2
end
は
code:c.rb
class C
include M2
include M1
end
と同じ
すなわち、次のような流れになる
CクラスとObjectクラスの間にM2が入る
CクラスとM1の間にM2が入る
したがって正解は
code:sh
# ruby gold/ex05/main.rb
/icons/hr.icon
クラス、モジュールのスーパークラスとインクルードしているモジュールを優先順位順に配列に格納して返します。
ancestorsは「祖先」って意味だよ